package com.yuange.utils.db.mysql;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

/**
 * @作者：工号308、袁智彪
 * @时间：2022/5/25 9:12
 */
public class MySQLDruidDataPool {

    static Logger log = LoggerFactory.getLogger(MySQLDruidDataPool.class);

    static DruidDataSource druidDataSource;

    /**
     * 初始化线程池
     */
    static {
        Config load_comment = ConfigFactory.load("comment/comment.properties");
        String mode = load_comment.getString("mode");
        Config load = null;

        if (mode.equals("test")){
            load = ConfigFactory.load(mode + "/flink-" + mode + ".properties");
        }else if (mode.equals("prd")){
            load = ConfigFactory.load(mode + "/flink-" + mode + ".properties");
        }else if (mode.equals("dev")){
            load = ConfigFactory.load(mode + "/flink-" + mode + ".properties");
        }
        String mysql_driver = load.getString("mysql_driver");
        String mysql_url = load.getString("mysql_url");
        String mysql_username = load.getString("mysql_username");
        String mysql_password = load.getString("mysql_password");
        String initialSize = load.getString("initialSize");
        String maxActive = load.getString("maxActive");
        String minIdle = load.getString("minIdle");
        String maxWait = load.getString("maxWait");
        String testOnBorrow = load.getString("testOnBorrow");
        String test_on_return = load.getString("test_on_return");
        String test_while_idle = load.getString("test_while_idle");

        Properties properties = new Properties();//配置文件对象
        properties.setProperty("driverClassName", mysql_driver);
        properties.setProperty("username",mysql_username);
        properties.setProperty("password",mysql_password);
        //初始化时建立物理连接的个数。初始化发生在显示调用init方法，或者第一次getConnection时
        properties.setProperty("initialSize",initialSize);
        //最大连接池数量
        properties.setProperty("maxActive",maxActive);
        //最小连接池数量
        properties.setProperty("minIdle",minIdle);
        //获取连接时最大等待时间，单位毫秒
        properties.setProperty("maxWait",maxWait);
        //用来检测连接是否有效的sql，要求是一个查询语句。如果validationQuery为null，testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
        properties.setProperty("validationQuery","select 1");
        //申请连接时执行validationQuery检测连接是否有效，做了这个配置会降低性能。
        properties.setProperty("testOnBorrow",testOnBorrow);
        //归还连接时执行validationQuery检测连接是否有效，做了这个配置会降低性能
        properties.setProperty("test-on-return",test_on_return);
        //建议配置为true，不影响性能，并且保证安全性。申请连接的时候检测，如果空闲时间大于timeBetweenEvictionRunsMillis，执行validationQuery检测连接是否有效。
        properties.setProperty("test-while-idle",test_while_idle);
        properties.setProperty("url",mysql_url);

        try {
            //加载配置文件,获取德鲁伊连接池
            druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取MYSQL连接
     * @return
     */
    public static Connection getConn(){
        Connection con = null;
        try {
//            System.out.println("=============dddddddddddddddd=====================");
//            log.info("=============dddddddddddddddd=====================");
            con = druidDataSource.getConnection();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return con;
    }

    /**
     * 关闭结果集和数据库处理对象(或预处理对象)和数据库连接对象(数据连接池本质上不会被关闭)
     * @param conn
     * @param ps
     */
    public static void close(Connection conn, PreparedStatement ps) {
        try{
            if(null != ps) {
                ps.close();
            }
            if(null != conn) {
                conn.close();
            }
        }catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 关闭结果集和数据库处理对象(或预处理对象)和数据库连接对象(数据连接池本质上不会被关闭)
     * @param conn
     * @param ps
     * @param rs
     */
    public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        try{
            if(null != rs) {
                rs.close();
            }
            if(null != ps) {
                ps.close();
            }
            if(null != conn) {
                conn.close();
            }
        }catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
}
